Houdiniメモ : VEX : ラグランジュ補間
■作ったもの
ラグランジュ補間を使用することで、任意のデータ点を必ず通るようなxの多項式(xのn次曲線)を求めることができます。
https://gyazo.com/3c00d64fcd10b1b5006bc53450a931f1
ネットワーク全体
https://gyazo.com/2814920e7e3e97f8d5603159d0550eb9
ノード詳細 : ラグランジュ補間用のラインとデータ点
Line
x軸方向のラインを作成しています。
https://gyazo.com/524b26b8010603e69fb5c2dc4fad0164
Add
データ点を定義しています。
https://gyazo.com/38203506f99d641a3595b2aaa5850d44
ノード詳細 : ラグランジュ補間の計算と可視化
Attribute Wrangle(1つ目)
ラインのポイントのx座標からラグランジュ補間L(x)を計算し、アトリビュートへ保存しています。
https://gyazo.com/2170e2f45b70bb0b5f8cf6c28f5bd25a
code:calc_Lagrange_Interpolation(c)
// ラグランジュ基底多項式 l_j(x) の計算
float calc_l(string geometry; int j; float x)
{
float l = 1.0;
vector data_j = point(geometry, "P", j);
for (int m = 0; m < npoints(geometry); m++)
{
if (j == m) { continue; }
vector data_m = point(geometry, "P", m);
float x_m = data_m.x;
l *= (x - data_m.x) / (data_j.x - data_m.x);
}
return l;
}
// ラグランジュ補間 L(x) の計算
float calc_L(string geometry; float x)
{
float L = 0.0;
for (int j = 0; j < npoints(geometry); j++)
{
vector data_m = point(geometry, "P", j);
L += data_m.y * calc_l(geometry, j, x);
}
return L;
}
f@LagrangeResult = calc_L(@OpInput2, @P.x);
Attribute Wrangle(2つ目)
計算したラグランジュ補間の値をポイントのY座標へ設定しています。 ラインの形状がラグランジュ補間に一致します。https://gyazo.com/76cc2f6439837c3aae3d0f042227608c
code:visualize_Lagrange_Interpolation(c)
@P.y = f@LagrangeResult;
ノード詳細 : データ点の可視化
データ点の可視化
https://gyazo.com/70b8bd59b963d88ac5e728e00d965564